

### `CPDF_SimpleFont` 类总结

`CPDF_SimpleFont` 是 PDFium 库中用于表示简单字体（Simple Font）的类，继承自 `CPDF_Font`。它主要用于处理 Type1、TrueType 和 CID 字体之外的简单字体类型，如标准14种字体（Standard 14 Fonts）。以下是该类的主要功能和成员的详细总结：

#### 公有成员函数(Public Member Functions)

1. * *析构函数 * *:
-**`~CPDF_SimpleFont() override;`** : 虚析构函数，确保派生类的析构函数被正确调用。

2. * *重写虚函数 * *:
  -**`int GetCharWidthF(uint32_t charcode) override;`** : 获取指定字符码的宽度。返回一个整数值，表示字符的宽度。
  - **`FX_RECT GetCharBBox(uint32_t charcode) override;`** : 获取指定字符码的边界框。返回一个 `FX_RECT` 对象，表示字符的边界框。
  - **`int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override;`** : 根据字符码获取字形索引。返回一个整数值，表示字形索引；`pVertGlyph` 指针用于指示是否为垂直字形。
  - **`bool IsUnicodeCompatible() const override;`** : 检查字体是否支持 Unicode 编码。返回布尔值，`true` 表示支持，`false` 表示不支持。
  - **`WideString UnicodeFromCharCode(uint32_t charcode) const override;`** : 根据字符码获取对应的 Unicode 字符串。返回一个 `WideString` 对象，表示 Unicode 字符串。
  - **`uint32_t CharCodeFromUnicode(wchar_t Unicode) const override;`** : 根据 Unicode 字符获取字符码。返回一个 32 位整数，表示字符码。
  - **`bool HasFontWidths() const override;`** : 检查字体是否包含宽度信息。返回布尔值，`true` 表示包含，`false` 表示不包含。

  3. * *编码管理 * *:
-**`const CPDF_FontEncoding * GetEncoding() const { return &m_Encoding; }`** : 获取当前字体的编码对象。返回一个指向 `CPDF_FontEncoding` 对象的常量指针。

#### 受保护的成员函数(Protected Member Functions)

1. * *构造函数 * *:
-**`CPDF_SimpleFont(CPDF_Document * pDocument, RetainPtr<CPDF_Dictionary> pFontDict);`** : 构造函数，初始化 `CPDF_SimpleFont` 实例。`pDocument` 是指向 PDF 文档的指针，`pFontDict` 是字体字典的智能指针。

2. * *虚函数 * *:
-**`virtual void LoadGlyphMap() = 0;`** : 加载字形映射表的纯虚函数，具体实现由派生类提供。

3. * *加载函数 * *:
  -**`bool LoadCommon();`** : 加载通用的字体数据，包括编码、字符名称等。返回布尔值，`true` 表示加载成功，`false` 表示加载失败。
  - **`void LoadSubstFont();`** : 加载替代字体，通常用于处理嵌入式字体或缺失的字符。
  - **`void LoadCharMetrics(int charcode);`** : 加载指定字符码的度量信息，包括宽度和边界框。
  - **`void LoadCharWidths(const CPDF_Dictionary * font_desc);`** : 从字体描述符中加载字符宽度信息。
  - **`void LoadDifferences(const CPDF_Dictionary * encoding);`** : 从编码字典中加载字符名称差异表。
  - **`void LoadPDFEncoding(bool bEmbedded, bool bTrueType);`** : 加载 PDF 编码表，根据是否嵌入和是否为 TrueType 字体进行不同的处理。

  #### 私有成员变量(Private Member Variables)

  - **`static constexpr size_t kInternalTableSize = 256;`** : 定义内部表的大小为 256，用于存储字符码到字形索引、宽度和边界框的映射。
  - **`CPDF_FontEncoding m_Encoding{ FontEncoding::kBuiltin };`** : 存储当前字体的编码对象，默认使用内置编码。
  - **`FontEncoding m_BaseEncoding = FontEncoding::kBuiltin;`** : 存储基础编码方式，默认使用内置编码。
  - **`bool m_bUseFontWidth = false;`** : 标记是否使用字体宽度信息，默认为 `false`。
  - **`std::vector<ByteString> m_CharNames;`** : 存储字符名称的向量，用于处理字符名称差异表。
  - **`std: : array<uint16_t, kInternalTableSize> m_GlyphIndex;`** : 存储字符码到字形索引的映射表，大小为 256。
  - **`std: : array<uint16_t, kInternalTableSize> m_CharWidth;`** : 存储字符码到宽度的映射表，大小为 256。
  - **`std: : array<FX_RECT, kInternalTableSize> m_CharBBox;`** : 存储字符码到边界框的映射表，大小为 256。

  ### 功能概述

  `CPDF_SimpleFont` 类是 PDFium 库中处理简单字体的核心组件之一，主要用于管理和解析 PDF 文档中的简单字体类型。它提供了以下主要功能：

  1. * *字符宽度和边界框获取 * *：通过重写的虚函数 `GetCharWidthF` 和 `GetCharBBox`，能够获取指定字符码的宽度和边界框信息，确保文本的正确布局和渲染。
  2. * *字符码和 Unicode 的双向转换 * *：通过 `GlyphFromCharCode`、`UnicodeFromCharCode` 和 `CharCodeFromUnicode` 方法，支持字符码与 Unicode 之间的双向转换，确保多语言文本的正确显示。
  3. * *编码管理 * *：通过 `GetEncoding` 方法提供对字体编码的访问，支持多种常见的编码方式（如 WinAnsi、MacRoman 等），确保字符的正确解析。
  4. * *字体宽度信息管理 * *：通过 `HasFontWidths` 方法检查字体是否包含宽度信息，并通过 `LoadCharWidths` 方法加载字符宽度信息，确保文本的精确排版。
  5. * *字符名称差异表处理 * *：通过 `LoadDifferences` 方法加载字符名称差异表，支持自定义字符名称的映射，确保特殊字符的正确显示。
  6. * *字形映射表加载 * *：通过 `LoadGlyphMap` 方法加载字形映射表，确保字符码到字形索引的正确映射，支持复杂字符集的处理。
  7. * *替代字体管理 * *：通过 `LoadSubstFont` 方法加载替代字体，确保无法显示的字符能够找到合适的替代方案。

  这些功能共同作用，使得 `CPDF_SimpleFont` 类能够在 PDF 文档处理过程中高效地管理和使用简单字体资源，确保文本的正确显示和渲染。 
  / Copyright 2016 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFAPI_FONT_CPDF_SIMPLEFONT_H_
#define CORE_FPDFAPI_FONT_CPDF_SIMPLEFONT_H_

#include <stdint.h>

#include <array>
#include <vector>

#include "core/fpdfapi/font/cpdf_font.h"
#include "core/fpdfapi/font/cpdf_fontencoding.h"
#include "core/fxcrt/fx_string.h"

class CPDF_SimpleFont : public CPDF_Font {
 public:
  ~CPDF_SimpleFont() override;

  // CPDF_Font
  int GetCharWidthF(uint32_t charcode) override;
  FX_RECT GetCharBBox(uint32_t charcode) override;
  int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override;
  bool IsUnicodeCompatible() const override;
  WideString UnicodeFromCharCode(uint32_t charcode) const override;
  uint32_t CharCodeFromUnicode(wchar_t Unicode) const override;

  const CPDF_FontEncoding* GetEncoding() const { return &m_Encoding; }

  bool HasFontWidths() const override;

 protected:
  static constexpr size_t kInternalTableSize = 256;

  CPDF_SimpleFont(CPDF_Document* pDocument,
                  RetainPtr<CPDF_Dictionary> pFontDict);

  virtual void LoadGlyphMap() = 0;

  bool LoadCommon();
  void LoadSubstFont();
  void LoadCharMetrics(int charcode);
  void LoadCharWidths(const CPDF_Dictionary* font_desc);
  void LoadDifferences(const CPDF_Dictionary* encoding);
  void LoadPDFEncoding(bool bEmbedded, bool bTrueType);

  CPDF_FontEncoding m_Encoding{FontEncoding::kBuiltin};
  FontEncoding m_BaseEncoding = FontEncoding::kBuiltin;
  bool m_bUseFontWidth = false;
  std::vector<ByteString> m_CharNames;
  std::array<uint16_t, kInternalTableSize> m_GlyphIndex;
  std::array<uint16_t, kInternalTableSize> m_CharWidth;
  std::array<FX_RECT, kInternalTableSize> m_CharBBox;
};

#endif  // CORE_FPDFAPI_FONT_CPDF_SIMPLEFONT_H_
